package modelo.persistenciaArquivo;

import modelo.dominio.Veiculo;
import modelo.dominio.TipoVeiculo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Collections;


public class PersistenciaVeiculo {
	//criação da lista de veiculos
	
	public static ArrayList<Veiculo> listVeiculos = new ArrayList<Veiculo>();
	
	//cadastro de veiculos
	public void cadastrarVeiculo(Veiculo veiculo) {
		listVeiculos.add(veiculo);	
	}
	
	//lista de veiculos
	public static ArrayList<Veiculo> getListVeiculos(){
		return listVeiculos;
	}
		
	//retorna lista de determinada categoria
	public static ArrayList<Veiculo> listagemPorCategoria(Veiculo veiculo) {
		ArrayList<Veiculo> listCategoria = new ArrayList<Veiculo>();
		
		for(int i = 0; i< listVeiculos.size(); i++) {
			if(listVeiculos.get(i).getTipoVeiculo().getIdTipoVeiculo() == veiculo.getTipoVeiculo().getIdTipoVeiculo()) {
				listCategoria.add(listVeiculos.get(i));			
			}
		}
		return listCategoria;
	}
		   
		   
	//buscar veiculo por placa
	public Veiculo buscaVeiculoPorPlaca(Veiculo veiculo) {
		for(int i = 0; i < listVeiculos.size(); i++) {
			if(listVeiculos.get(i).getPlaca().equals(veiculo.getPlaca())) {
				return listVeiculos.get(i);
			}
		}			
		return null;
	}
	
	//muda disponibilidade para veiculo locado
	public void mudarDisponibilidade(Veiculo veiculo) {
		for(int i = 0; i < listVeiculos.size(); i++){
			if(listVeiculos.get(i).getPlaca().equals(veiculo.getPlaca())) {
				listVeiculos.get(i).setDisponivel(false);
			}
		}
	}
	
	//mudar disponibilidade para veiculo livre
	public void mudarDisponibilidadeLivre(Veiculo veiculo) {
		for(int i = 0; i < listVeiculos.size(); i++){
			if(listVeiculos.get(i).getPlaca().equals(veiculo.getPlaca())) {
				listVeiculos.get(i).setDisponivel(true);
			}
		}
	}
	
	//altera valor da quantidade de locacaoes
	public void addQuantLocacao(Veiculo veiculo) {
		for(int i = 0; i < listVeiculos.size(); i++){
			if(listVeiculos.get(i).getPlaca().equals(veiculo.getPlaca())) {
				int quant = listVeiculos.get(i).getQuantLocacao();
				quant++;
				listVeiculos.get(i).setQuantLocacao(quant);
			}
		}
	}
	
	//acrescentar valor da locacao
	public void addValorLocacao(Veiculo veiculo, double valorLocacao) {
		for(int i = 0; i < listVeiculos.size(); i++){
			if(listVeiculos.get(i).getPlaca().equals(veiculo.getPlaca())) {
				double valorLoc = listVeiculos.get(i).getValorLocacoes();
				valorLoc = valorLoc + valorLocacao;
				listVeiculos.get(i).setValorLocacoes(valorLoc);
			}
		}
	}
	
	//procura por veiculos disponiveis
     public static ArrayList<Veiculo> veiculosDisponiveis() {
		ArrayList<Veiculo> listDisponiveis = new ArrayList<Veiculo>();
		for(int i = 0; i < listVeiculos.size(); i++) {
			if(listVeiculos.get(i).isDisponivel() == true) {
				listDisponiveis.add(listVeiculos.get(i));
			}
		}
		return listDisponiveis;
	}
	
	//ordenar por numeros de locacoes
	public static ArrayList<Veiculo> veiculosMaisProcurados(ArrayList<Veiculo> listVeiculos) {
		ArrayList<Veiculo> listaMaisProcurados = new ArrayList<Veiculo>();
		
		for(int i = 0;i <listVeiculos.size(); i++){
			listaMaisProcurados.add(listVeiculos.get(i));
		}
		Collections.sort(listaMaisProcurados, new ComparadorQuantLocacao());
		Collections.reverse(listaMaisProcurados);
		return listaMaisProcurados;
	}
		
	//ordenar por valor de locacoes
	public static ArrayList<Veiculo> veiculoMaisRentavel(ArrayList<Veiculo> listVeiculos) {
		ArrayList<Veiculo> listRentaveis = new ArrayList<Veiculo>();
		
		for(int i = 0;i <listVeiculos.size(); i++){
			listRentaveis.add(listVeiculos.get(i));
		}
		Collections.sort(listRentaveis, new ComparadorValorLocacao());
		Collections.reverse(listRentaveis);
		return listRentaveis;
	}
		
	//carregar lista de veiculo
	public boolean carregarVeiculo(ArrayList<Veiculo> listveiculos) throws IOException{
		String modelo = "";
		String placa = "";
		String marca = "";
		String cor = "";
		String observacoes = "";
		String opcionais = "";
		boolean disponivel = false;
		int quantLocacao = 0;
		double valorLocacoes = 0.00;
		int id = 0;
		String linha;
		Veiculo veiculo;
		
		File fp = new File("Veiculos.txt");
		
		if(!fp.exists()) {
			return false;
		}
		
		BufferedReader br = new BufferedReader(new FileReader(fp));
		
		while((linha = br.readLine())!= null) {
			String[] str = linha.split(";");
			
			modelo = str[0];
			placa = str[1];
			marca = str[2];
			cor = str[3];
			opcionais = str[4];
			observacoes = str[5];
			disponivel = Boolean.parseBoolean(str[6]);
			quantLocacao = Integer.parseInt(str[7]);
			valorLocacoes = Double.parseDouble(str[8]);
			id = Integer.parseInt(str[9]);
			TipoVeiculo tipoVeiculo = new TipoVeiculo(Integer.parseInt(str[10])); 
			Veiculo novoVeiculo = new Veiculo(modelo,placa,marca,cor,opcionais,
				observacoes,disponivel,quantLocacao,valorLocacoes,tipoVeiculo);
                        cadastrarVeiculo(novoVeiculo);
			
		}
		br.close();
		return true;
	
	}
	
	//salva veiculos em arquivo
	public void salvarVeiculo(ArrayList<Veiculo> listVeiculos) throws IOException {
		String modelo;
		String placa;
		String marca;
		String cor;
		String opcionais;
		String observacoes;
		boolean  disponivel;
		int quantLocacao;
		double valorLocacoes;
		int id;
		
		FileWriter fp = new FileWriter(new File("Veiculos.txt"));
		
		for(int i =0; i < listVeiculos.size(); i++) {
			modelo = listVeiculos.get(i).getModelo();
			placa = listVeiculos.get(i).getPlaca();
			marca = listVeiculos.get(i).getMarca();
			cor = listVeiculos.get(i).getCor();
			opcionais = listVeiculos.get(i).getOpcionais();
			observacoes = listVeiculos.get(i).getObservacoes();
			disponivel = listVeiculos.get(i).isDisponivel();
			quantLocacao = listVeiculos.get(i).getQuantLocacao();
			valorLocacoes = listVeiculos.get(i).getValorLocacoes();
			fp.write(modelo+";"+ placa+";"+ marca+";"+ cor+";"+ opcionais +
				";"+ observacoes + ";"+ disponivel + ";"+ quantLocacao +";" +
				   valorLocacoes + ";" + listVeiculos.get(i).getTipoVeiculo().getIdTipoVeiculo() +"\n");
		}
		fp.close();
		
	}
	
	//salva veiculos em arquivo
	public void acrescentarVeiculo(Veiculo veiculo) throws IOException {
		TipoVeiculo tipoVeiculo = new TipoVeiculo();
		
		BufferedWriter writer = new BufferedWriter(new FileWriter("Veiculos.txt", true));
		PrintWriter output = new PrintWriter(writer);
		
		output.println(veiculo.getModelo() + ";"
		+ veiculo.getPlaca() + ";"
		+ veiculo.getMarca() + ";"
		+ veiculo.getCor() + ";"
		+ veiculo.getOpcionais() + ";"
		+ veiculo.getObservacoes() + ";"
		+ veiculo.isDisponivel() + ";"
		+ veiculo.getQuantLocacao() + ";"
		+ veiculo.getValorLocacoes() + ";"
		+ tipoVeiculo.getIdTipoVeiculo());
		writer.close();
		output.close();
	}

}
